package com.token.sysflow.core;

import com.alibaba.fastjson.JSONObject;
import com.token.sql.IntegrateSql;
import com.token.sysflow.hander.ApproveProcess;
import com.token.sysflow.impl.AbstractFlowHandlerImpl;
import com.token.sysflow.impl.SubmitFlowImpl;

/**
 * 会审提交
 *
 * @author chenjianxiong 2020/4/13
 */
public class SubmitHS extends SubmitFlow {
    /**
     * @param f
     * @param process
     * @throws Exception
     */
    public SubmitHS(IntegrateSql f, ApproveProcess process) throws Exception {
        super(f, process);
    }

    @Override
    public void execute(AbstractFlowHandlerImpl flowHandler) throws Exception {

        submitFlow = (SubmitFlowImpl) flowHandler;
        String stepId = approveProcess.getStepId();

        //初始化起草人、申请人、当前人。
        initUserInfo(approveProcess.getCreater(),approveProcess.getApplyer(),submitFlow.getActionUser());

        approveProcess.close();
        synchronized (SubmitHS.class) {
            //出于并发的考虑，这里必须重新读取一次。
            System.out.println(">>>开始锁定 = " + flowHandler.getActionUser());
            approveProcess = new ApproveProcess(this.getISql(),submitFlow.getKeyUnid());
            if(stepId.equals(approveProcess.getStepId())) { //当前流程还在同一环节时。
                //提交前的处理。
                submitFlowHandlerBefore();

                //计算会审结果
                int hsResult = approveProcess.getHSResult();
                System.out.println("hsResult = " + hsResult);
                if (hsResult == ApproveProcess.HSRESULT_YES) { //会审通过
                    System.out.println(">>>会审通过：" + flowHandler.getActionUser());
                    //设置目标流程
                    super.setToFlowById(approveProcess.getFlowId());

                    //设置目标环节
                    JSONObject jsonObject  = submitFlow.getFieldValues();
                    if(jsonObject == null){
                        jsonObject = new JSONObject();
                    }
                    jsonObject.putAll(this.getUserInfoMap());
                    super.setToStep(this.getFromStep().getDefaultNextStep(jsonObject));

                    //计算出目标办理人
                    super.executeDefaultApprover();

                    //根据环节类型来提交到下一环节。
                    super.submitByToStepType(submitFlow.getActionUser());

                    //更新办理意见
                    updateOpinions();

                    //生成新的流转记录和办理意见
                    flowHandler.setOpinions(flowHandler.getOpinions()+"【当前会审结果：通过】");

                    //生成当前办理人的流转记录
                    super.createFlowApproveLog(flowHandler);

                    //生成知会记录
                    super.handleNotification(submitFlow.getActionUser(),submitFlow.getSelectApprover(),submitFlow.getFieldValues());

                } else if (hsResult == ApproveProcess.HSRESULT_NO) { //不通过,退回起草环节
                    System.out.println(">>>会审不通过：" + flowHandler.getActionUser());
                    //处理退回。
                    handleHsResultNo();

                    //更新办理意见
                    updateOpinions();

                    //生成新的流转记录和办理意见
                    flowHandler.setOpinions(flowHandler.getOpinions() + "当前会审结果：不通过");

                    //生成当前办理人的流转记录
                    super.createFlowApproveLog(flowHandler);

                } else if (hsResult == ApproveProcess.HSRESULT_ING) { //未完成审批
                    System.out.println(">>>会审继续：" + flowHandler.getActionUser());
                    //添加输出参数
                    approveProcess.appendFlowProcessInfo(fromFlow,fromStep);

                    //更新办理意见
                    updateOpinions();

                    //生成当前办理人的流转记录
                    super.createFlowApproveLog(flowHandler);
                }
            }else{
                //比较少的情况出现，由于并发，环节可以在上一办理人审批完成后，会审的结果就已经计算出来并流转到下一环节。那么当前审批就只做相关记录，不做流转。可能退回开始或提交下一环节。

                //更新办理意见
                updateOpinions();

                //生成当前办理人的流转记录
                super.createFlowApproveLog(flowHandler);

                //更新当前办理状态结束
                approveProcess.updateApproverToEnd(this.getFromStep(), submitFlow.getActionUser(), submitFlow.getOpinions(), submitFlow.getHSResult());
            }
            System.out.println(">>>结束锁定 = " + flowHandler.getActionUser());
        }

    }

    /**
     * 更新办理意见，把投票的结果写到意见中
     */
    private void updateOpinions(){
        if (submitFlow.getHSResult() == SubmitFlowImpl.HSResult_YES) {
            submitFlow.setOpinions("【通过】" + submitFlow.getOpinions()); //办理意见
        } else {
            submitFlow.setOpinions("【不通过】" + submitFlow.getOpinions()); //办理意见
        }
    }

    /**
     * 处理会审不通过：退回到开始环节。
     */
    protected void handleHsResultNo() throws Exception {

        //FlowRecord flowRecord = new FlowRecord(this.getISql(),approveProcess.getKeyUnid());
        flowRecord.setStartStep(getFromFlow().getFlowId());

        //设置目标流程
        super.setToFlow(getFromFlow());

        //设置目标环节
        super.setToStepById(flowRecord.getStepId());

        //设置目标办理人
        submitFlow.setSelectApprover(flowRecord.getApprover().split(";"));

        //根据环节类型来退回。
        super.returnByToStepType();
    }
}
